<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>拖拽</title>
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui">
    <script src="https://www.itxst.com/package/vue/vue.min.js"></script>
    <script src="https://www.itxst.com/package/sortable/Sortable.min.js"></script>
    <script src="https://www.itxst.com/package/vuedraggable/vuedraggable.umd.min.js"></script>
    <style>
        /*定义要拖拽元素的样式*/
        .ghostClass {
            background-color: blue !important;
        }

        .chosenClass {
            background-color: red !important;
            opacity: 1 !important;
        }

        .dragClass {
            background-color: blueviolet !important;
            opacity: 1 !important;
            box-shadow: none !important;
            outline: none !important;
            background-image: none !important;
        }

        .itxst {
            margin: 10px;
        }

        .title {
            padding: 6px 12px;
        }

        .col {
            width: 40%;
            flex: 1;
            padding: 10px;
            border: solid 1px #eee;
            border-radius: 5px;
            float: left;
        }

        .col+.col {
            margin-left: 10px;
        }

        .item {
            padding: 6px 12px;
            margin: 0px 10px 0px 10px;
            border: solid 1px #eee;
            background-color: #f1f1f1;
        }

        .item:hover {
            background-color: #fdfdfd;
            cursor: move;
        }

        .item+.item {
            border-top: none;
            margin-top: 6px;
        }
    </style>
</head>

<body style="padding:10px;">
    <div id="app">
        <!--使用draggable组件-->
        <div class="itxst">
            <div class="col">
                <div class="title">A列</div>
                <draggable :value="arr1" :clone="() => []" :group="{name:'row',pull:'clone'}" animation="300" :sort='false'
                    dragClass="dragClass" ghostClass="ghostClass" chosenClass="chosenClass" @start="onStart"
                    @end="onEnd">
                    <transition-group>
                        <div class="item" v-for="item in arr1" :key="item.id">{{item.name}}</div>
                    </transition-group>
                </draggable>
            </div>
            <div class="col">
                <div class="title">B列</div>
                <draggable :list="arr2" :group="{name:'row',sort:true,pull:false}" animation="300" dragClass="dragClass"
                    ghostClass="ghostClass" chosenClass="chosenClass" @start="onStart" @end="onEnd"
                    @add="(e) => addFieldByDrag(e)">
                    <transition-group>
                        <div class="item" v-for="(item,index) in arr2" :key="index">
                            <div>
                                <draggable :list="item" animation="300" dragClass="dragClass" ghostClass="ghostClass"
                                    chosenClass="chosenClass">
                                    <transition-group>
                                        <div class="item" v-for="item1 in item" :key="item1.id">{{item1.name}}</div>
                                    </transition-group>
                                </draggable>
                            </div>
                        </div>
                    </transition-group>
                </draggable>
            </div>
        </div>
    </div>
    <script>
        /**
         * 需求：左侧元素固定，不可内部排序，可以进行拖拽，右侧元素可以内部排序，但是右侧数据结构是数组中套数组，我们希望将左侧json对象处理之后放入右侧数组的对应位置
         * 而不是直接放一个json对象进去
         * 第一步：左侧start开始拖拽事件回调，拿到当前元素索引，从而拿到当前josn元素，但是右侧需要接受的是一个数组，因此，需要利用clone属性和group里面的pull:'clone'
         * 设置pull:'clone'代表我们是要克隆元素，而不是把这个元素拿出去
         * 设置clone回调函数：我们要克隆个什么元素拿出去，这儿我们是直接克隆一个空数组出去
         * 右侧不能用value去绑定arr2，我也不知道为什么，但是我自己觉得拖拽容器中的元素不增不减的情况下用value去绑定，否则就甩list
         * 用了list之后，就直接将空数组插入拖放的位置，但是我们要得不是一个空数组
         * 在接收方绑定add事件，拿到当前空数组在arr2中的索引，删除他，以数组的形式插入之前拿到的josn元素
         * 
         * 
         */
        Vue.component('vuedraggable', window.vuedraggable.name)
        var app = new Vue({
            el: '#app',
            components: {
                vuedraggable,
            },
            data() {
                return {
                    arr1: [{
                            id: 1,
                            name: 'www.itxst.com'
                        },
                        {
                            id: 2,
                            name: 'www.jd.com'
                        },
                        {
                            id: 3,
                            name: 'www.baidu.com'
                        },
                        {
                            id: 4,
                            name: 'www.taobao.com'
                        }
                    ],
                    arr2: [
                        [{
                                id: 2,
                                name: 'www.jd.com'
                            },
                            {
                                id: 3,
                                name: 'www.baidu.com'
                            }
                        ],
                    ],
                    dragData:{}
                };
            },
            methods: {
                onStart(e) {
                    console.log(e);
                    const oldIndex = e.oldIndex;
                    this.dragData = this.arr1[oldIndex]
                },
                onEnd() {
                    // console.log(this.arr1);
                    // console.log(this.arr2);
                },
                addFieldByDrag(e) {
                    console.log(e);
                    const newIndex = e.newIndex;
                    this.arr2.splice(newIndex, 1, [this.dragData]);
                    console.log(this.arr2);
                }

            }
        });
    </script>
</body>

</html>